package com.hc.programming.string;

/**
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 * 示例 1：
 * 输入：s = "42"
 * 输出：42
 * 解释：加粗的字符串为已经读入的字符，插入符号是当前读取的字符。
 * 带下划线线的字符是所读的内容，插入符号是当前读入位置。
 * 第 1 步："42"（当前没有读入字符，因为没有前导空格）
 * 第 2 步："42"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
 * 第 3 步："42"（读入 "42"）
 * <p>
 * 示例 2：
 * 输入：s = " -042"
 * 输出：-42
 * 解释：
 * 第 1 步："   -042"（读入前导空格，但忽视掉）
 * 第 2 步："   -042"（读入 '-' 字符，所以结果应该是负数）
 * 第 3 步："   -042"（读入 "042"，在结果中忽略前导零）
 * <p>
 * 示例 3：
 * 输入：s = "1337c0d3"
 * 输出：1337
 * 解释：
 * 第 1 步："1337c0d3"（当前没有读入字符，因为没有前导空格）
 * 第 2 步："1337c0d3"（当前没有读入字符，因为这里不存在 '-' 或者 '+'）
 * 第 3 步："1337c0d3"（读入 "1337"；由于下一个字符不是一个数字，所以读入停止）
 * <p>
 * 示例 4：
 * 输入：s = "0-1"
 * 输出：0
 * 解释：
 * 第 1 步："0-1" (当前没有读入字符，因为没有前导空格)
 * 第 2 步："0-1" (当前没有读入字符，因为这里不存在 '-' 或者 '+')
 * 第 3 步："0-1" (读入 "0"；由于下一个字符不是一个数字，所以读入停止)
 * <p>
 * 示例 5：
 * 输入：s = "words and 987"
 * 输出：0
 * 解释：
 * 读取在第一个非数字字符“w”处停止。
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/6/8 16:03
 */
public class 字符串转换整数atoi {
    public static void main(String[] args) {
        System.out.println(-1l << 31);
        System.out.println((1l << 31) - 1);
        System.out.println(Integer.MAX_VALUE);
        System.out.println(myAtoi("42"));
    }

    public static int myAtoi(String s) {
        char[] arr = s.toCharArray();
        long min = -1 << 31;
        long max = (1l << 31) - 1;
        int syn = 1; // 符号
        boolean isStartNum = false; // 是否开始计数
        int num = 0;
        for (char c : arr) {
            if (!isStartNum && (c == ' ' || c == '+' || c == '-')) {
                if (c == '-') {
                    syn = -1;
                }
                if (c == '-' || c == '+') {
                    isStartNum = true;
                }
                continue;
            }

            if (c <= '9' && c >= '0') {
                isStartNum = true;
                if (10L * num + syn * (c - '0') < min) {
                    return (int) min;
                } else if (10L * num + syn * (c - '0') > max) {
                    return (int) max;
                }
                num = 10 * num + syn * (c - '0');
            } else {
                return num;
            }
        }
        return num;
    }
}
